package com.xuecheng.service.Impl;

import com.xuecheng.service.CacheService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xuecheng.POJO.Cache;
import com.xuecheng.mapper.CacheMapper;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

@Service
public class CacheServiceImpl extends ServiceImpl<CacheMapper, Cache> implements CacheService {


    private static final String FFMPEG_PATH = "D:\\APP\\Tools\\ffmpeg-7.0.2-essentials_build\\bin\\ffmpeg.exe";

    @Autowired
    CacheMapper cacheMapper;

    // 检查视频 URL 是否已存在，如果不存在则保存
    @Override
    public boolean checkAndSave(String videoUrl) {
        // 判断是否已经存在
        Cache existingCache = this.lambdaQuery().eq(Cache::getVideosUrl, videoUrl).one();
        if (existingCache == null) {
            // 如果不存在，保存新的视频数据
            Cache newCache = new Cache();
            newCache.setVideosUrl(videoUrl);
            newCache.setStatus("PENDING");
            return super.save(newCache);  // 保存到数据库
        }
        return false;  // 如果已存在，返回false表示没有插入
    }


    // 下载视频并分片
    /**
     * 从指定的URL下载视频，并使用FFmpeg将其分割成指定时长的多个片段
     *
     * @param videoUrl 视频的URL或本地路径
     * @param outputDir 输出目录，用于存储分割后的视频片段
     * @param segmentDuration 每个视频片段的持续时间（以秒为单位）
     * @throws IOException 如果在执行FFmpeg命令或处理进程输出时发生I/O错误
     * @throws InterruptedException 如果在等待FFmpeg命令执行完成时线程被中断
     */
    @Override
    public void downloadAndSplitVideo(String videoUrl, String outputDir, String fileName, int segmentDuration) throws IOException, InterruptedException {
        // 确保输出路径不包含特殊字符
        String sanitizedFileName = fileName.replaceAll("[^a-zA-Z0-9\\-]", "_");  // 替换掉非法字符
        String outputPattern = outputDir + File.separator + sanitizedFileName + "_%03d.mp4";  // 使用统一的格式进行命名

        // 构建 FFmpeg 命令来分片
        List<String> command = new ArrayList<>();
        command.add(FFMPEG_PATH);  // FFmpeg 可执行文件
        command.add("-i");  // 输入文件参数
        command.add(videoUrl);  // 视频的 URL 或本地路径
        command.add("-c:v");  // 视频编码格式
        command.add("libx264");  // 使用 H.264 编码
        command.add("-preset");  // 视频编码预设
        command.add("fast");  // 编码速度设置
        command.add("-f");  // 强制指定输出格式
        command.add("segment");  // 切割模式
        command.add("-segment_time");  // 切片时间（秒）
        command.add(String.valueOf(segmentDuration));  // 每个切片的持续时间
        command.add("-segment_format");  // 切片文件格式
        command.add("mp4");  // 切片格式为 mp4
        command.add("-segment_list");  // 切片列表文件
        command.add(outputDir + File.separator + "segments.m3u8");  // 切片列表文件名
        command.add(outputPattern);  // 切片输出文件的命名格式

        // 执行 FFmpeg 命令
        ProcessBuilder processBuilder = new ProcessBuilder(command);
        processBuilder.redirectErrorStream(true);
        Process process = processBuilder.start();

        // 获取命令输出
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        }

        // 等待进程执行完毕
        int exitCode = process.waitFor();
        if (exitCode == 0) {
            System.out.println("视频切片下载成功！");
        } else {
            System.out.println("FFmpeg 命令执行失败！");
        }
    }



//    public static void main(String[] args) {
//        String videoUrl = "http://example.com/path/to/video.mp4";  // 视频 URL 或本地路径
//        String outputDir = "C:\\path\\to\\output";  // 输出目录
//        int segmentDuration = 10;  // 每个切片的时间，单位秒
//
//        try {
//            downloadAndSplitVideo(videoUrl, outputDir, segmentDuration);
//        } catch (IOException | InterruptedException e) {
//            e.printStackTrace();
//        }
//    }

}





















//    private static final Logger logger = LoggerFactory.getLogger(CacheServiceImpl.class);

//    // 爬取方法
//    public void crawl(String url) {
//        // 设置 ChromeDriver 路径
//        System.setProperty("webdriver.chrome.driver", "C:\\Users\\Lenovo\\Downloads\\chromedriver_win32\\chromedriver.exe");
//
//        // 配置 ChromeOptions
//        ChromeOptions options = new ChromeOptions();
//        options.setBinary("C:\\Users\\Lenovo\\Downloads\\chrome-win\\chrome.exe");
//        options.addArguments("--headless");  // 无头模式
//        options.addArguments("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36");
//        options.addArguments("--disable-gpu");  // 禁用 GPU 加速
//        options.addArguments("--no-sandbox");  // 禁用沙箱
//        options.addArguments("--disable-dev-shm-usage");  // 禁用共享内存使用
//        options.addArguments("--remote-debugging-port=9222");  // 设置调试端口
//
//        // 创建 WebDriver 实例
//        WebDriver driver = new ChromeDriver(options);
//
//        try {
//            // 打开视频页面
//            driver.get(url);
//
//            // 显式等待，确保页面加载完成
////            WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
//            WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(30));  // 增加等待时间
//            wait.until(ExpectedConditions.presenceOfElementLocated(By.className("module-poster-item-title")));
//
//
//            // 获取视频 URL
//            WebElement videoElement = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("video#lelevideo")));
//            String videoUrl = videoElement.getAttribute("src");
//            logger.info("Video URL: " + videoUrl); // 使用日志输出
//
//            // 获取下一集链接（假设它位于 `span.handle-btn-name a`）
//            try {
//                WebElement nextEpisodeElement = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("span.handle-btn-name a")));
//                String nextEpisodeUrl = nextEpisodeElement.getAttribute("href");
//                logger.info("Next Episode URL: " + nextEpisodeUrl); // 使用日志输出
//            } catch (NoSuchElementException e) {
//                logger.warn("Next episode link not found.");
//            }
//
//        } catch (NoSuchElementException e) {
//            logger.error("Element not found: " + e.getMessage());
//        } catch (TimeoutException e) {
//            logger.error("Timeout waiting for elements: " + e.getMessage());
//        } catch (Exception e) {
//            logger.error("An error occurred: ", e);
//        } finally {
//            // 确保浏览器资源释放
//            if (driver != null) {
//                driver.quit();
//            }
//        }
//    }
//
//    // 测试方法
//    @Test
//    public void testCrawl() throws Exception {
//        String url = "https://www.yinghuadm.cn/play_2536-1-3.html"; // 输入你想爬取的链接
//        crawl(url);
//    }
//
//    public static void main(String[] args) {
//        // 设置 Chrome 驱动路径
//        System.setProperty("webdriver.chrome.driver", "C:\\Users\\Lenovo\\Downloads\\chromedriver_win32\\chromedriver.exe");
//
//        ChromeOptions options = new ChromeOptions();
//        options.setBinary("C:\\Users\\Lenovo\\Downloads\\chrome-win\\chrome.exe");
//        // 创建 WebDriver 实例
//        WebDriver driver = new ChromeDriver(options);
//
//
//        try {
//            // 打开首页
//            driver.get("https://www.yinghuadm.cn/");
//
//            // 等待页面加载完成，确保所有元素加载完毕
//            WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
//            wait.until(ExpectedConditions.presenceOfElementLocated(By.className("module-poster-item-title")));
//
//            // 获取所有匹配的 <div> 元素
//            List<WebElement> titleElements = driver.findElements(By.className("module-poster-item-title"));
//
//            // 遍历并打印出所有标题文本
//            for (WebElement titleElement : titleElements) {
//                String titleText = titleElement.getText();
//                System.out.println("ABCCCCC"+titleText);
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            // 关闭浏览器
//            driver.quit();
//        }
//    }
//}
